home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Topik / Topik - Disk 16 - KnowAboutIt (19xx)(Topik Public Domain)(PD)[WB].zip / Topik - Disk 16 - KnowAboutIt (19xx)(Topik Public Domain)(PD)[WB].adf / MicroRayDbw / display.c < prev    next >
C/C++ Source or Header  |  1988-12-11  |  8KB  |  280 lines

  1. /************************************************************************
  2.  *                                    *
  3.  *            Copyright (c) 1988, David B. Wecker            *
  4.  *                All Rights Reserved                *
  5.  *                                    *
  6.  * This file is part of DBW_uRAY                    *
  7.  *                                    *
  8.  * DBW_uRAY is distributed in the hope that it will be useful, but    *
  9.  * WITHOUT ANY WARRANTY. No author or distributor accepts        *
  10.  * responsibility to anyone for the consequences of using it or for    *
  11.  * whether it serves any particular purpose or works at all, unless    *
  12.  * he says so in writing. Refer to the DBW_uRAY General Public        *
  13.  * License for full details.                        *
  14.  *                                    *
  15.  * Everyone is granted permission to copy, modify and redistribute    *
  16.  * DBW_uRAY, but only under the conditions described in the        *
  17.  * DBW_uRAY General Public License. A copy of this license is        *
  18.  * supposed to have been given to you along with DBW_uRAY so you    *
  19.  * can know your rights and responsibilities. It should be in a file    *
  20.  * named COPYING. Among other things, the copyright notice and this    *
  21.  * notice must be preserved on all copies.                *
  22.  ************************************************************************
  23.  *                                    *
  24.  * Authors:                                *
  25.  *    DBW - David B. Wecker                        *
  26.  *                                    *
  27.  * Versions:                                *
  28.  *    V1.0 881023 DBW    - First released version            *
  29.  *    V1.1 881110 DBW - Fixed scan coherence code            *
  30.  *    V1.2 881125 DBW - Removed ALL scan coherence code (useless)    *
  31.  *              added "fat" extent boxes            *
  32.  *                                    *
  33.  ************************************************************************/
  34.  
  35. #define VERSION "uRAY v1.0 881029 (C) 1988 D. Wecker - all rights reserved\n"
  36.  
  37. /************************************************************************/
  38. /************* program to display IFF/ILBM files on an AMIGA ************/
  39. /************************************************************************/
  40.  
  41. #include <stdio.h>
  42. #include <intuition/intuitionbase.h>
  43. #include <functions.h>
  44.  
  45. #define BPP        4            /* Bits per pixel */
  46. #define DEPTH        6            /* HAM screen depth */
  47.  
  48. #define MAXGRAY        (1 << BPP)
  49. #define    ABS(x)        ((x) < 0 ? -(x) : (x))
  50. #define MIN(a,b)    ((a) < (b) ? (a) : (b))
  51. #define MAX(a,b)    ((a) > (b) ? (a) : (b))
  52.  
  53. /* chunk sizes */
  54. long    FORMsize,BODYsize,CAMGsize,CMAPsize,BMHDsize;
  55.  
  56. FILE            *fp;
  57. short            bytcnt,val;
  58. unsigned char        chr,buf[128],*planes[DEPTH];
  59. char            cod,str[10],colors[256][3];
  60. unsigned long        class;
  61. unsigned short        code;
  62. unsigned char        docompress,depth;
  63. short            ham,lace,hires;
  64. short            width,height,top,left,maxbyte;
  65. long            modes;
  66.  
  67. /*********************** 68000 I/O routines ******************************/
  68.  
  69. void wfil(fil,cnt,val)        /* write a number to a file (68000 order) */
  70. FILE    *fil;
  71. short    cnt;
  72. char    val[];
  73.     {
  74. #ifdef MCH_AMIGA
  75.     fwrite(val,cnt,1,fil);
  76. #else
  77.     while (cnt--) fwrite(&val[cnt],1,1,fil);
  78. #endif
  79.     }
  80.  
  81. short rfil(fil,cnt,val)        /* read a number from a file (68000 order) */
  82. FILE    *fil;
  83. short    cnt;
  84. char    val[];
  85.     {
  86.  
  87. #ifdef MCH_AMIGA
  88.     if (fread(val,cnt,1,fil) != 1)             return(-1);
  89. #else
  90.     while (cnt--) if (fread(&val[cnt],1,1,fil) != 1) return(-1);
  91. #endif
  92.  
  93.     return(0);
  94.     }
  95.  
  96. /************************* structure defs *********************************/
  97.  
  98. struct    GfxBase        *GfxBase;
  99. struct    IntuitionBase    *IntuitionBase;
  100. struct    RastPort    *rp;
  101. struct    ViewPort    *vp;
  102. struct    Screen        *screen;
  103. struct    NewScreen    ns = {
  104.     0L,0L,352L,464L,6L,
  105.     0,1,HAM|LACE,
  106.     CUSTOMSCREEN,NULL,
  107.     (UBYTE *)"uRAY Display",
  108.     NULL,NULL };
  109.  
  110.  
  111. /* leave program and return all resources */
  112. error(lev,msg)
  113. short   lev;
  114. char *msg;
  115.     {
  116.     switch (lev) {
  117.  
  118.     case 5:
  119.     CloseScreen(screen);
  120.     RemakeDisplay();
  121.  
  122.     case 4:
  123.     CloseLibrary(IntuitionBase);
  124.  
  125.     case 3:
  126.     CloseLibrary(GfxBase);
  127.  
  128.     case 2:
  129.  
  130.     case 1:
  131.     if (fp != NULL) fclose(fp);
  132.  
  133.     case 0:
  134.     if (msg) {
  135.         fprintf(stderr,"display: %s\n",msg);
  136.         exit(2);
  137.         }
  138.     }
  139.     exit(0);
  140.     }
  141.  
  142. main(argc,argv)
  143. int    argc;
  144. char    **argv;
  145.     {
  146.     char    f1[40],f2[40],fname[80];
  147.     short   i,j,k,modulo;
  148.  
  149.     printf(VERSION);
  150.     printf("\n\t(Type <return> to end display)\n\n");
  151.  
  152.  
  153.     if (argc < 2)   strcpy(fname,"uray");
  154.     else        strcpy(fname,argv[1]);
  155.     strcat(fname,".ilbm");
  156.     fp  = fopen(fname, "r");
  157.     if (fp == NULL) error(1,"Error opening input file");
  158.  
  159.     /* here is where we read the ILBM file in */
  160.     if (fread(str,1,4,fp) != 4 || strncmp(str,"FORM",4) != 0) error(2,"no FORM");
  161.     if (rfil(fp,4,&FORMsize)) error(2,"no FORM length");
  162.     if (fread(str,1,4,fp) != 4 || strncmp(str,"ILBM",4) != 0) error(2,"no ILBM");
  163.  
  164.     if (fread(str,1,4,fp) != 4 || strncmp(str,"BMHD",4) != 0) error(2,"no BMHD");
  165.     if (rfil(fp,4,&BMHDsize) || BMHDsize != 20L) error(2,"bad BMHD length");
  166.     if (rfil(fp,2,&width))            error(2,"bad BMHD");
  167.     if (rfil(fp,2,&height))            error(2,"bad BMHD");
  168.     if (rfil(fp,2,&top))            error(2,"bad BMHD");
  169.     if (rfil(fp,2,&left))            error(2,"bad BMHD");
  170.     if (rfil(fp,1,&depth))            error(2,"bad BMHD");
  171.     if (rfil(fp,1,buf))                error(2,"bad BMHD");
  172.     if (rfil(fp,1,&docompress))            error(2,"bad BMHD");
  173.     if (rfil(fp,9,buf))                error(2,"bad BMHD");
  174.     maxbyte = width >> 3;
  175.     if (docompress != 0 && docompress != 1)
  176.     error(2,"Unknown compression technique");
  177.     if (depth < 1 || depth > 6) error(2,"Bad depth!!");
  178.  
  179.     if (fread(str,1,4,fp) != 4 || strncmp(str,"CAMG",4) != 0) error(2,"no CAMG");
  180.     if (rfil(fp,4,&CAMGsize) || CAMGsize != 4L)    error(2,"bad CAMG length");
  181.     if (rfil(fp,4,&modes)) error(2,"can't read in CAMG");
  182.     if (modes & HIRES)        hires   = 1;
  183.     else            hires   = 0;
  184.     if (modes & HAM)        ham        = 1;
  185.     else            ham        = 0;
  186.     if (modes & LACE)        lace    = 1;
  187.     else            lace    = 0;
  188.     ns.ViewModes = modes;
  189.     ns.Depth     = (long)depth;
  190.     ns.TopEdge     = (long)top;
  191.     if (height > 464) ns.Height     = (long)height;
  192.     if (width  > 352) ns.Width     = (long)width;
  193.     if (width  < 352) modulo = (352 >> 3) - maxbyte;
  194.     else          modulo = 0;
  195.  
  196.     /* set up to display the image */
  197.     GfxBase    = (struct GfxBase *)OpenLibrary("graphics.library",0L);
  198.     if (GfxBase == NULL) error(2,"No graphics library");
  199.     IntuitionBase = 
  200.     (struct IntuitionBase *)OpenLibrary("intuition.library",0L);
  201.     if (IntuitionBase == NULL) error(3,"No intuition library");
  202.     screen    = (struct Screen *)OpenScreen(&ns);
  203.     if (screen == NULL) error(4,"Can't open screen");
  204.  
  205.     vp        = &screen->ViewPort;
  206.     rp        = &screen->RastPort;
  207.  
  208.     if (lace && height > 400)        vp->DyOffset += (400 - height) >> 1;
  209.     if (lace == 0 && height > 200)  vp->DyOffset += (200 - height) >> 1;
  210.     if (hires && width > 640)        vp->DxOffset += (640 - width)  >> 1;
  211.     if (hires == 0 && width > 320)  vp->DxOffset += (320 - width)  >> 1;
  212.  
  213.     RemakeDisplay();
  214.  
  215.     if (fread(str,1,4,fp) != 4 || strncmp(str,"CMAP",4) != 0) error(5,"no CMAP");
  216.     if (rfil(fp,4,&CMAPsize)) error(5,"bad CMAP length");
  217.     CMAPsize /= 3;
  218.     for (i = 0; i < CMAPsize; i++) {
  219.     if (fread(str,1,3,fp) != 3) error(5,"can't read in color table");
  220.     colors[i][0] = (str[0] >> 4) & 0xF;
  221.     colors[i][1] = (str[1] >> 4) & 0xF;
  222.     colors[i][2] = (str[2] >> 4) & 0xF;
  223.     if (i < 16 || ham == 0)
  224.         SetRGB4(vp, (long)i,
  225.             (long)colors[i][0],
  226.             (long)colors[i][1],
  227.             (long)colors[i][2]);
  228.     }
  229.  
  230.     if (fread(str,1,4,fp) != 4 || strncmp(str,"BODY",4) != 0) error(5,"no BODY");
  231.     if (rfil(fp,4,&BODYsize)) error(5,"bad BODY length");
  232.  
  233.  
  234.     for (i = 0; i < depth; i++) {
  235.     planes[i] = (unsigned char *)rp->BitMap->Planes[i];
  236.     }
  237.  
  238.     for (i = 0; i < height; i++) {
  239.     for (j = 0; j < depth; j++) {
  240.  
  241.         if (docompress) {
  242.         bytcnt  = 0;
  243.  
  244.         while (bytcnt < maxbyte) {
  245.             if (fread(&cod,1,1,fp) != 1) goto DONE;
  246.             val = (short)cod;
  247.  
  248.             if (val >= 0) {
  249.             val++;
  250.             if (fread(planes[j],1,val,fp) != val) goto DONE;
  251.             }
  252.             else if (val > -128) {
  253.             val = (-val) + 1;
  254.             if (fread(&chr,1,1,fp) != 1) goto DONE;
  255.             for (k = 0; k < val; k++) planes[j][k] = chr;
  256.             }
  257.             else val = 0;
  258.  
  259.             bytcnt        += val;
  260.             planes[j]        += val;
  261.             if (bytcnt > maxbyte) error(5,"Bad run/dump count");
  262.             }
  263.         }
  264.         else {
  265.         if (fread(planes[j],1,maxbyte,fp) != maxbyte) goto DONE;
  266.         planes[j] += maxbyte;
  267.         }
  268.         planes[j] += modulo;    /* take care of undersized image */
  269.         }
  270.     }
  271.     DONE:
  272.     fclose(fp);
  273.     RemakeDisplay();
  274.     
  275.  
  276.     /* wait here until we get a close window message */
  277.     getchar();
  278.     error(5,NULL);
  279.     }
  280.